﻿using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Controls;
using System.Windows.Documents;

using SimbaRGVMonitor.Common.Diagnostics;

namespace SimbaRGVMonitor.Common.Diagnostics
{
    partial class MonitorLogBox : UserControl
    {
        public MonitorLogBox()
        {
            InitializeComponent();
            InitializeSettings();
        }

        //====================================================================================================
        //以上是类型构造函数
        //----------------------------------------------------------------------------------------------------
        //以下是类型字段
        //====================================================================================================

        private Paragraph lastParagraph;

        //====================================================================================================
        //以上是类型字段
        //----------------------------------------------------------------------------------------------------
        //以下是类型属性
        //====================================================================================================

        public int MaxSize { get; set; }

        //====================================================================================================
        //以上是类型属性
        //----------------------------------------------------------------------------------------------------
        //以下是初始化设置
        //====================================================================================================

        private void InitializeSettings()
        {
            MaxSize = 1000;

            clearButton.Click += WhenClearButtonClick;
        }

        //====================================================================================================
        //以上是初始化设置
        //----------------------------------------------------------------------------------------------------
        //以下是界面控件事件侦听
        //====================================================================================================

        private void WhenClearButtonClick(object sender, RoutedEventArgs e)
        {
            messageBox.Document.Blocks.Clear();
            lastParagraph = null;
        }

        //====================================================================================================
        //以上是界面控件事件侦听
        //----------------------------------------------------------------------------------------------------
        //以下是添加日志
        //====================================================================================================

        public void AddLog(DateTime receiveTime, LogLevel level, string logText)
        {
            var text = string.Format("{0} {1}", receiveTime.ToString("yyyy-MM-dd HH:mm:ss,fff"), logText);
            var textRun = new Run(text);
            textRun.FontSize = 12;
            textRun.FontWeight = FontWeights.Bold;
            textRun.Foreground = GetLevelBrush(level);

            var paragraph = new Paragraph();
            paragraph.Inlines.Add(textRun);

            if(lastParagraph == null)
            {
                messageBox.Document.Blocks.Add(paragraph);
            }
            else
            {
                messageBox.Document.Blocks.InsertBefore(lastParagraph, paragraph);
            }

            lastParagraph = paragraph;

            if (messageBox.Document.Blocks.Count > MaxSize)
            {
                var lastBlock = messageBox.Document.Blocks.LastBlock;
                messageBox.Document.Blocks.Remove(lastBlock);
            }
        }

        //====================================================================================================
        //以上是添加日志
        //----------------------------------------------------------------------------------------------------
        //以下是根据日志等级格式刷
        //====================================================================================================

        private SolidColorBrush GetLevelBrush(LogLevel level)
        {
            if(level == LogLevel.DEBUG)
            {
                return Brushes.DarkCyan;
            }
            else if(level == LogLevel.INFO)
            {
                return Brushes.Navy;
            }
            else if(level == LogLevel.WARN)
            {
                return Brushes.YellowGreen;
            }
            else if(level == LogLevel.ERROR)
            {
                return Brushes.Firebrick;
            }
            else if(level == LogLevel.FATAL)
            {
                return Brushes.DarkRed;
            }
            return Brushes.Navy;
        }
    }
}
